package com.example.musicserver.tools;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileVerify {
    /**
     * 判断上传的文件是否为MP3文件
     * @param file 上传的文件
     * @return true 如果是MP3文件，false 如果不是
     */
    public static boolean isMP3File(MultipartFile file) throws IOException {
//         第一种判断：判断文件名是否以.mp3结尾
        String fileName = file.getOriginalFilename();
        if (file == null || fileName == null || !fileName.toLowerCase().endsWith(".mp3")) {
            return false;
        }
//        第二种判断：尾部ID3v1标签128字节，前三个字节为TAG
        try {
            // 获取文件的字节数组，读取文件的最后128字节
            byte[] fileBytes = file.getBytes();
            int fileLength = fileBytes.length;

            // 如果文件小于128字节，无法包含ID3v1标签
            if (fileLength < 128) {
                return false;
            }

            // 获取文件的最后128字节
            byte[] last128Bytes = new byte[3];
            /**
             * 数组复制：源数组，起始位置，目标数组，目标数组起始位置，复制的元素个数
             */
            System.arraycopy(fileBytes, fileLength - 128, last128Bytes, 0, 3);

            // 检查ID3v1标签的前三个字节是否为 "TAG"
            if (last128Bytes[0] == 'T' && last128Bytes[1] == 'A' && last128Bytes[2] == 'G') {
                return true;  // 包含ID3v1标签，认为是有效的MP3文件
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

//            第三种判断：判断头部，mp3有一些特定的文件头（ID3v2标签的标识符，它可能在头部也可能在中间）或（MP3的帧头信息）

        try (InputStream inputStream = file.getInputStream()) {
            byte[] header = new byte[3]; // 用于读取文件头的前三个字节
            inputStream.read(header);

            // 检查文件头部是否包含 "ID3" 标识符（ID3v2标签）
            if (header[0] == 'I' && header[1] == 'D' && header[2] == '3') {
                // ID3v2标签
                return true;
            }

            // 读取MP3帧头
            byte[] frameHeader = new byte[4]; // 用来读取MP3帧头
            inputStream.read(frameHeader);
 //             第四种判断：检查文件是否是一个有效的MP3帧（音频数据通常以 "FF FB" 或者 "FF FA"开头）

            if (frameHeader[0] == (byte) 0xFF && (frameHeader[1] == (byte) 0xFA || frameHeader[1] == (byte) 0xFB)) {
                // MP3帧头的标志位，表示这是一个有效的MP3音频帧
                return true;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;  // 如果没有找到ID3v1标签
    }

}
